package pe.com.sysaut.seguridad.service.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import pe.com.sysaut.seguridad.bean.UsuarioBean;
import pe.com.sysaut.seguridad.controller.SeguridadController;
import pe.com.sysaut.seguridad.dao.TCargoDao;
import pe.com.sysaut.seguridad.dao.TopcionesporperfilDao;
import pe.com.sysaut.seguridad.dao.TperfilDao;
import pe.com.sysaut.seguridad.dao.TpersonaDao;
import pe.com.sysaut.seguridad.dao.TusuarioDao;
import pe.com.sysaut.seguridad.domain.Tcargo;
import pe.com.sysaut.seguridad.domain.Topcionaplicacion;
import pe.com.sysaut.seguridad.domain.Tperfil;
import pe.com.sysaut.seguridad.domain.Tpersona;
import pe.com.sysaut.seguridad.domain.Tusuario;
import pe.com.sysaut.seguridad.service.SeguridadService;
import pe.com.sysaut.seguridad.vmodel.PersonaView;
import pe.com.sysaut.util.ConstanteSYSAUT;
import pe.com.sysaut.util.Constantes;
import pe.com.sysaut.util.MenuItemSysaut;
import pe.com.sysaut.util.MsgDialogs;
import pe.com.sysaut.util.Util;

import com.google.gson.Gson;

@Service(value="seguridadService")
@Qualifier("seguridadService")
public class SeguridadServiceImpl implements SeguridadService{

	
	private static final Logger logger = Logger.getLogger(SeguridadController.class);
	
	
	@Autowired
	TusuarioDao tusuarioDao;
	@Autowired
	TopcionesporperfilDao topcionesporperfilDao;
	@Autowired
	TpersonaDao tpersonaDao;
	@Autowired
	TCargoDao tCargoDao;
	@Autowired
	TperfilDao tperfilDao;
	
	
	
	@Override
	public UsuarioBean getUsuarioLogin(String usuario, String contrasenia) {
		// TODO Auto-generated method stub
		Tusuario tusuario=tusuarioDao.findByUsuarioContrasenia(usuario, contrasenia);
		
		if (tusuario!=null){
			UsuarioBean usuarioBean=new UsuarioBean();
			usuarioBean.setCodigo(tusuario.getIdUsuario());
			usuarioBean.setCodigoPerfil(tusuario.getIdPerfil());
			usuarioBean.setNombreCargo(tusuario.getIdCargo());
			return usuarioBean;
		}
		
		
		return null;
	}

	@Override
	public String obtenerMenu(UsuarioBean usuarioBean) {
		// TODO Auto-generated method stub
		
		List<Topcionaplicacion> lstTopcionaplicacion=topcionesporperfilDao.getOpcionesAplicacionXUsuario(usuarioBean);
		List<Topcionaplicacion> lstOpcionAplicacionAux=lstTopcionaplicacion;
		
		Map<String, Object> mapMenuItems=new HashMap<String, Object>();
		List<MenuItemSysaut> lsMenuItemSysaut=new ArrayList<MenuItemSysaut>();
		
		for (Topcionaplicacion oa:lstTopcionaplicacion){
			MenuItemSysaut mi=new MenuItemSysaut();
			mi.setIdItem(oa.getIdOpcion().toString());
			mi.setNombre(oa.getNomOpcion());
			mi.setUrl(oa.getLinkOpcion());
			
			List<Topcionaplicacion> lstOpcionAplicacionHijas=this.obtenerOpcionesAplicacionHijas(oa.getIdOpcion(), lstOpcionAplicacionAux);
			
			if (lstOpcionAplicacionHijas!=null && lstOpcionAplicacionHijas.size()>0){
				
				if (((int)oa.getIdPadre())==Constantes.ID_PADRE_ROOT){
					mi.setTipo(Constantes.TIPO_MENU_PADRE);
				}
				else{
					mi.setTipo(Constantes.TIPO_MENU_HIJO);
				}
				List<Map<String, Object>> lstReferencias=new ArrayList<Map<String,Object>>();
				for (Topcionaplicacion oah:lstOpcionAplicacionHijas){
					Map<String, Object> mapReferencia=new HashMap<String, Object>();
					mapReferencia.put("_reference", oah.getIdOpcion().toString());
					lstReferencias.add(mapReferencia);
				}
				mi.setHijos(lstReferencias);
			}else{
				mi.setTipo(Constantes.TIPO_MENU_HIJO);
			}
			lsMenuItemSysaut.add(mi);
		}
		
		mapMenuItems.put(Constantes.JSON_ESTRUCTURA_ITEMS, lsMenuItemSysaut);
		mapMenuItems.put(Constantes.JSON_ESTRUCTURA_LABEL, "nombre");
		mapMenuItems.put(Constantes.JSON_ESTRUCTURA_IDENTIFIER, "idItem");
		
		return (new Gson()).toJson(mapMenuItems);
	}

	/*******************************************[Gestion Usuario-Consulta de usuarios]**************************************/
	@Override
	public String obtenerUsuariosPorFiltros(String nombre, String usuario) {
		// TODO Auto-generated method stub
		
		return (new Gson()).toJson(tusuarioDao.findByFiltros(nombre, usuario));
	}
	
	@Override
	public String registrarUsuario(UsuarioBean usuarioBean){
		logger.info(this.getClass().getName()+"registrarUsuario()[");
		String respuesta="";
		
		Tusuario tusuario=new Tusuario();
		tusuario.setIdUsuario(tusuarioDao.findNextId());
		tusuario.setContUsuario(usuarioBean.getContrasenia().getBytes());
		tusuario.setIdCargo(usuarioBean.getIdCargo());
		tusuario.setIdPerfil(usuarioBean.getIdPerfil());
		tusuario.setNomUsuario(usuarioBean.getNomUsuario());
		tusuario.setNumDni(usuarioBean.getNumDni());
		
		try {
			tusuarioDao.insertUsuarioo(tusuario);
			respuesta=Util.obtenerMapMesaje(MsgDialogs.msg_registrar_usuario_ok, ConstanteSYSAUT.CONSTATE_ID_MENSAJES_TIPO_INFORMATIVO);
		} catch (HibernateException e) {
			// TODO Auto-generated catch block
			logger.error(e);
			respuesta=Util.obtenerMapMesaje(MsgDialogs.msg_registrar_usuario_error, ConstanteSYSAUT.CONSTATE_ID_MENSAJES_TIPO_ERROR);
		} catch (RuntimeException e) {
			// TODO Auto-generated catch block
			logger.error(e);
			respuesta=Util.obtenerMapMesaje(MsgDialogs.msg_registrar_usuario_error, ConstanteSYSAUT.CONSTATE_ID_MENSAJES_TIPO_ERROR);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			logger.error(e);
			respuesta=Util.obtenerMapMesaje(MsgDialogs.msg_registrar_usuario_error, ConstanteSYSAUT.CONSTATE_ID_MENSAJES_TIPO_ERROR);
		}
		finally{
			logger.info(this.getClass().getName()+"registrarUsuario()]");
			return respuesta;
		}
		
	}
	/*******************************************[Gestion Usuario-Consulta de usuarios]**************************************/
	
	
	/*******************************************[REUTILIZABLE]**************************************/
	
	@Override
	public List<Tcargo> obtenerListaCargos(){
		return tCargoDao.findAll();
		
	}
	
	
	@Override
	public String buscarPersona(String codigo, String nombre){
		
		List<Tpersona> lsTpersonas=tpersonaDao.findByFiltros(codigo, nombre);
		List<PersonaView> lsPersonaViews=new ArrayList<PersonaView>();
		PersonaView personaView;
		
		for (Tpersona tpersona:lsTpersonas){
			personaView=new PersonaView();
			personaView.setDni(tpersona.getNumDni());
			personaView.setNombreCompleto(tpersona.getApePaterno().concat(" ")
					.concat(tpersona.getApeMaterno()).concat(", ").concat(tpersona.getNomPersona()));
			personaView.setCorreo(tpersona.getDirCorreo());
			lsPersonaViews.add(personaView);
		}
		
		
		return (new Gson()).toJson(lsPersonaViews);
	}
	
	@Override
	public List<Tperfil> obtenerListaPerfiles() {

		return tperfilDao.findAll();
	}
	
	@Override
	public String registrarPersona(PersonaView personaView){
		
		String respuesta="";
		Tpersona tpersona=new Tpersona();
		tpersona.setApeMaterno(personaView.getApeMaterno());
		tpersona.setApePaterno(personaView.getApePaterno());
		tpersona.setDirCorreo(personaView.getCorreo());
		tpersona.setFecNacimiento(Util.convertirStringFormatToDate(personaView.getFechaNacimiento(),Constantes.FORMATO_FECHA_INFORMIX));
		tpersona.setNumTelefono(personaView.getTelefono());
		tpersona.setNomPersona(personaView.getNombre());
		tpersona.setNumDni(personaView.getDni());
		
		
		if (tpersonaDao.findByPK(tpersona.getNumDni())!=null){
			return Util.obtenerMapMesaje(MsgDialogs.msg_registrar_persona_duplicado, ConstanteSYSAUT.CONSTATE_ID_MENSAJES_TIPO_ERROR);
		}
		
		try{
			tpersonaDao.insertPersona(tpersona);
			respuesta=Util.obtenerMapMesaje(MsgDialogs.msg_registrar_persona_ok, ConstanteSYSAUT.CONSTATE_ID_MENSAJES_TIPO_INFORMATIVO);
		}
		catch (HibernateException e) {
			respuesta=Util.obtenerMapMesaje(MsgDialogs.msg_registrar_persona_error, ConstanteSYSAUT.CONSTATE_ID_MENSAJES_TIPO_ERROR);
		}
		catch (RuntimeException ex){
			respuesta=Util.obtenerMapMesaje(MsgDialogs.msg_registrar_persona_error, ConstanteSYSAUT.CONSTATE_ID_MENSAJES_TIPO_ERROR);
		}
		catch (Exception e) {
			respuesta=Util.obtenerMapMesaje(MsgDialogs.msg_registrar_persona_error, ConstanteSYSAUT.CONSTATE_ID_MENSAJES_TIPO_ERROR);
		}
		
		
		
		return respuesta;
	}
	
	@Override
	public String generarUsuario(String dni){
		
		String respuesta="";
		
		Tpersona tpersona=tpersonaDao.findByPK(dni);
		
		String usuario=tpersona.getNumDni()+tpersona.getNomPersona().charAt(0);
		Tusuario tusuario=tusuarioDao.findByUsuario(usuario);
		
		if (tusuario==null){
			Map<String, Object> mapUsuario=new HashMap<String, Object>();
			mapUsuario.put(ConstanteSYSAUT.CONSTANTE_ID_MAP_PASO_VALOR, usuario);
			
			respuesta=(new Gson()).toJson(mapUsuario);
		}
		else{
			Map<String, Object> mapUsuario=new HashMap<String, Object>();
			mapUsuario.put(ConstanteSYSAUT.CONSTANTE_ID_MAP_PASO_VALOR, ConstanteSYSAUT.CONSTANTE_VALOR_MAP_PASO_VALOR);
			mapUsuario.put(ConstanteSYSAUT.CONSTATE_ID_MAP_MENSAJE_MENSAJE,MsgDialogs.msg_registrar_usuario_existe.concat(tusuario.getNomUsuario()));
			
			respuesta=(new Gson()).toJson(mapUsuario);
		}
		
		
		
		return respuesta;
	}
	/*******************************************[REUTILIZABLE]**************************************/
	
	
	private List<Topcionaplicacion> obtenerOpcionesAplicacionHijas(Short idOpcion, List<Topcionaplicacion> lstOpcionAplicacion) {
		
		List<Topcionaplicacion> lstOpcionAplicacionHijas = new ArrayList<Topcionaplicacion>();
		for(Topcionaplicacion oa: lstOpcionAplicacion){
			if(idOpcion.intValue()==(int)oa.getIdPadre()){
				lstOpcionAplicacionHijas.add(oa);
			}
		}
		return lstOpcionAplicacionHijas;
	}
	
	

	
}
